package com.mongo.utils;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.text.StrPool;
import cn.hutool.core.util.StrUtil;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class TxtToEntityConverter {

    public final static String MODULE_CODE = "network";

    public static void main(String[] args) {
        // 示例：处理当前目录下的example_data.txt文件
        String filePath = "D:\\work\\doc\\多组学数据库\\Network\\Coexpression-data.txt";
        try {
            convertTxtToJavaCode(filePath);
            System.out.println("Java实体类生成成功！");
        } catch (IOException e) {
            System.err.println("处理文件时出错：" + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 将制表符分隔的txt文件转换为Java实体类
     *
     * @param filePath txt文件路径
     * @throws IOException 当文件操作失败时抛出
     */
    public static void convertTxtToJavaCode(String filePath) throws IOException {
        // 获取文件名作为类名（首字母大写）
        String fileName = Paths.get(filePath).getFileName().toString();
        String fileDir = Paths.get(filePath).getParent().toFile().getAbsolutePath();
        String className = getClassNameFromFileName(fileName);

        // 读取文件第一行（表头）
        String headerLine = readFirstLine(filePath);
        if (headerLine == null || headerLine.trim().isEmpty()) {
            throw new IOException("文件为空或没有表头信息");
        }

        // 按制表符分割表头
        String[] headers = headerLine.split("\t");

        // 生成Java实体类代码
        String entityCode = generateJavaEntityCode(fileName, headers);
        writeJavaFile(fileDir, className, entityCode);

        //生成service代码
        String serviceCode = generateJavaServiceCode(className);
        writeJavaFile(fileDir, className + "Service", serviceCode);

        //生成serviceImpl代码
        String serviceImplCode = generateJavaServiceImplCode(className);
        writeJavaFile(fileDir, className + "ServiceImpl", serviceImplCode);

    }

    /**
     * 从文件名获取类名（去除扩展名，首字母大写）
     */
    private static String getClassNameFromFileName(String fileName) {
        // 去除文件扩展名
        int dotIndex = fileName.lastIndexOf('.');
        if (dotIndex > 0) {
            fileName = fileName.substring(0, dotIndex);
        }

        // 首字母大写
        if (fileName.isEmpty()) {
            return "Entity";
        }
        fileName = convertToCamelCase(fileName);
        return Character.toUpperCase(fileName.charAt(0)) +
            (fileName.length() > 1 ? fileName.substring(1) : "");
    }

    /**
     * 读取文件的第一行
     */
    private static String readFirstLine(String filePath) throws IOException {
        try (BufferedReader reader = Files.newBufferedReader(Paths.get(filePath))) {
            return reader.readLine();
        }
    }

    /**
     * 将表头转换为驼峰命名法的属性名
     */
    private static String convertToCamelCase(String header) {
        if (header == null || header.trim().isEmpty()) {
            return "property";
        }

        // 处理包含下划线或空格的情况
        String[] parts = header.split("[_\\-\\s]+");
        if (parts.length == 1) {
            // 没有分隔符，直接将首字母小写
            return Character.toLowerCase(header.charAt(0)) +
                (header.length() > 1 ? header.substring(1) : "");
        }

        // 有分隔符，将第一个部分首字母小写，其余部分首字母大写
        StringBuilder camelCase = new StringBuilder();
        camelCase.append(parts[0].toLowerCase());

        for (int i = 1; i < parts.length; i++) {
            String part = parts[i];
            if (!part.isEmpty()) {
                camelCase.append(Character.toUpperCase(part.charAt(0)));
                if (part.length() > 1) {
                    camelCase.append(part.substring(1).toLowerCase());
                }
            }
        }

        return camelCase.toString();
    }

    /**
     * 生成Java实体类代码
     */
    private static String generateJavaEntityCode(String fileName, String[] headers) {
        StringBuilder code = new StringBuilder();
        String className = getClassNameFromFileName(fileName);
        String collectionName = StrUtil.replace(StrUtil.subBefore(StrUtil.subBefore(fileName, "_", true), StrPool.DOT, true),"-","_").toLowerCase() ;
        // 包声明（可以根据需要修改）
        code.append("package com.biorun.dzxdb.module." + MODULE_CODE + ".entity;\n\n");
        code.append("import lombok.Data;\nimport java.io.Serializable;\n\n");
        code.append("import com.mongoplus.annotation.ID;\n" +
            "import com.mongoplus.annotation.collection.CollectionField;\n" +
            "import com.mongoplus.annotation.collection.CollectionName;\n\n");
        code.append("@Data\n");
        code.append("@CollectionName(value = \"").append(collectionName).append("\")\n");
        // 类声明
        code.append("public class ").append(className).append(" implements Serializable {\n\n");
        //生成id属性
        code.append("    @ID").append("\n");
        code.append("    @CollectionField(value = \"_id").append("\")\n");
        code.append("    private Long id;").append("\n\n");
        // 生成其他属性
        for (String header : headers) {
            String propertyName = convertToCamelCase(header);
            // 这里简化处理，默认使用String类型，实际应用中可能需要根据数据类型调整
            code.append("    @CollectionField(value = \"").append(header).append("\")\n");
            code.append("    private String ").append(propertyName).append(";\n\n");
        }

        code.append("\n");


        // 类结束
        code.append("}");

        return code.toString();
    }

    private static String generateJavaServiceCode(String className) {
        StringBuilder code = new StringBuilder();

        // 包声明（可以根据需要修改）
        code.append("package com.biorun.dzxdb.module." + MODULE_CODE + ".service;\n\n");
        code.append("import com.biorun.dzxdb.module." + MODULE_CODE + ".entity." + className + ";\n" +
            "import com.mongoplus.service.IService;\n\n");
        // 类声明
        code.append("public interface ").append(className + "Service").append(" extends IService<").append(className).append(">{\n\n");
        // 类结束
        code.append("}");

        return code.toString();
    }

    private static String generateJavaServiceImplCode(String className) {
        StringBuilder code = new StringBuilder();

        // 包声明（可以根据需要修改）
        code.append("package com.biorun.dzxdb.module." + MODULE_CODE + ".service.impl;\n\n");
        code.append("import com.biorun.dzxdb.module." + MODULE_CODE + ".entity." + className + ";\n" +
            "import com.biorun.dzxdb.module." + MODULE_CODE + ".service." + className + "Service;\n" +
            "import com.mongoplus.conditions.query.LambdaQueryChainWrapper;\n" +
            "import com.mongoplus.service.impl.ServiceImpl;\n" +
            "import org.springframework.stereotype.Service;\n\n");
        // 类声明
        code.append("@Service\n");
        code.append("public class ").append(className + "ServiceImpl").append(" extends ServiceImpl<").append(className).append("> implements ").append(className + "Service").append(" {\n\n");
        // 类结束
        code.append("}");

        return code.toString();
    }

    /**
     * 将生成的Java代码写入文件
     */
    private static void writeJavaFile(String parentDir, String className, String code) throws IOException {
        // 在当前目录创建输出文件
        // String outputPath = StrUtil.toCamelCase(className) + ".java";
        FileUtil.writeUtf8String(code, parentDir + File.separator + className + ".java");
       /* FileUtil.touch(parentDir,)
        Files.write(Paths.get(outputPath), code.getBytes());*/
    }
}
